package com.bing.java.thread;

/**
 * 
 * @author bing
 *
 * 2019年11月9日 上午11:15:17
 * 
 * join()
       在线程中调用另一个线程的 join() 方法，会将当前线程挂起，而不是忙等待，直到目标线程结束。
       对于以下代码，虽然 b 线程先启动，但是因为在 b 线程中调用了 a 线程的 join() 方法，b 线程会等待 a 线程结束才继续执行，因此最后能够保证 a 线程的输出先于 b 线程的输出。
 */
public class JoinExample {

	private class A extends Thread {
		@Override
		public void run() {
			System.out.println("A");
		}
	}

	private class B extends Thread {

		private A a;

		B(A a) {
			this.a = a;
		}

		@Override
		public void run() {
			try {
				a.join();   //这里是取决加入以及顺序
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("B");
		}
	}

	/**
	 * B线程先启动所以如果没有join就是BA
	 * 但是需要就是等A执行完在执行B，所以B线程中加入Join，等A执行完就执行B。结果就是AB
	 */
	public void test() {
		A a = new A();
		B b = new B(a);
		b.start();     //线程启动顺序
		a.start();
	}

	public static void main(String[] args) {
		JoinExample example = new JoinExample();
		example.test();
	}
}
